////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENT_GUI_H_
#define _CLIENT_GUI_H_

////////////////////////////////////////////////////////////////////////////////

#include <queue>

////////////////////////////////////////////////////////////////////////////////

#include "timer.h"
#include "client_engine.h"
#include "client_network.h"
#include "mutex.h"

////////////////////////////////////////////////////////////////////////////////

union SDL_Event;
struct SDL_Surface;
struct SDL_Rect;

class ClientGUI
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientGUI();
    
    
    /** Destructor */
    ~ClientGUI();

    
////////////////////////////////////////////////////////////////////////////////


    /** Start game */
    void Start();


////////////////////////////////////////////////////////////////////////////////

private:    
    
////////////////////////////////////////////////////////////////////////////////


    /** Processes user input */
    void ProcessEvent( const SDL_Event& _event );


    /** Save events to send queue */
    void SaveEvents();


    /** Draw */
    void Draw();


    /** Load Image */
    SDL_Surface* LoadImage( std::string _fileName );


    /** Draw one image on another */
    void ApplySurface( int x,
                       int y,
                       SDL_Surface* source,
                       SDL_Surface* destination,
                       SDL_Rect* clip = NULL );


////////////////////////////////////////////////////////////////////////////////


    /** Screen surface */
    SDL_Surface* m_Screen;


    /** Player surface */
    SDL_Surface* m_Player;


    /** Client engine */
    ClientEngine m_Engine;


    /** Client network */
    ClientNetwork m_Network;


    /** Packets for sending to server */
    ClientPackets m_SendQueue;


    /** Packets received from server */
    ServerPackets m_RecvQueue;


    /** Send collection mutex */
    Mutex m_SendQueueMutex;


    /** Receive collection mutex */
    Mutex m_RecvQueueMutex;


    /** Timer */
    Timer m_FPS;


////////////////////////////////////////////////////////////////////////////////
};
    
    
////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

